package com.eltsistemas.modelo;

import java.util.Calendar;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

@SuppressWarnings("serial")
@Entity
@org.hibernate.annotations.Entity(dynamicUpdate = true) 
public class Funcionario implements java.io.Serializable{
	 
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)	
	private Long id;
	
	@Column(nullable=false)
	private String nome;
	 
	@OneToOne(fetch=FetchType.LAZY)
	private Funcao funcao;
	 
	@ManyToOne(cascade=CascadeType.PERSIST,fetch=FetchType.LAZY)
	@JoinColumn(name="id_setor")
	private Setor setor;
	
	private Long id_cbo;
	 
	@Column(unique=true)
	private Long id_matricula;
	 
	@Column(nullable=false)
	private Double salarioFixo = 0.00D;

	private Double salarioVariavel = 0.00D;
	
	@Column(nullable=false)
	private String motivo;
	
	@Column(nullable=false)
	private String detalheMotivo;
		
	@Column(nullable=false) 
	private Double jornadaTrabalho;
	
	private String obs;
	
	@Column(nullable=false) 
	private Calendar dataAdmissao;
	
	@Column(nullable=false)
	private String outros;
	
	@Column(nullable=false)
	private String situacao;
	
	@ManyToMany
	@JoinTable(
			name = "beneficioFuncionario",
			joinColumns = @JoinColumn(name = "id_funcionario"), inverseJoinColumns = @JoinColumn(name = "id_beneficio")
	)
	private List<Beneficio> beneficioList;
	 
	@OneToMany(mappedBy="funcionario", targetEntity = Afastamento.class, cascade=CascadeType.REFRESH)
	private List<Afastamento> afastamentoList;
	
	@OneToMany(mappedBy="funcionario", targetEntity = AlteracaoSalarial.class, cascade=CascadeType.REMOVE)
	private List<AlteracaoSalarial> altSalarioList;
	 
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Funcao getFuncao() {
		return funcao;
	}

	public void setFuncao(Funcao funcao) {
		this.funcao = funcao;
	}

	public Setor getSetor() {
		return setor;
	}

	public void setSetor(Setor setor) {
		this.setor = setor;
	}

	public Long getId_cbo() {
		return id_cbo;
	}

	public void setId_cbo(Long id_cbo) {
		this.id_cbo = id_cbo;
	}

	public Long getId_matricula() {
		return id_matricula;
	}

	public void setId_matricula(Long id_matricula) {
		this.id_matricula = id_matricula;
	}

	public Double getSalarioFixo() {
		return salarioFixo;
	}

	public void setSalarioFixo(Double salarioFixo) {
		this.salarioFixo = salarioFixo;
	}

	public Double getSalarioVariavel() {
		return salarioVariavel;
	}

	public void setSalarioVariavel(Double salarioVariavel) {
		this.salarioVariavel = salarioVariavel;
	}

	public String getMotivo() {
		return motivo;
	}

	public void setMotivo(String motivo) {
		this.motivo = motivo;
	}

	public String getDetalheMotivo() {
		return detalheMotivo;
	}

	public void setDetalheMotivo(String detalheMotivo) {
		this.detalheMotivo = detalheMotivo;
	}

	public Double getJornadaTrabalho() {
		return jornadaTrabalho;
	}

	public void setJornadaTrabalho(Double jornadaTrabalho) {
		this.jornadaTrabalho = jornadaTrabalho;
	}

	public String getObs() {
		return obs;
	}

	public void setObs(String obs) {
		this.obs = obs;
	}

	public Calendar getDataAdmissao() {
		return dataAdmissao;
	}

	public void setDataAdmissao(Calendar dataAdmissao) {
		this.dataAdmissao = dataAdmissao;
	}

	public String getOutros() {
		return outros;
	}

	public void setOutros(String outros) {
		this.outros = outros;
	}

	public List<Beneficio> getBeneficioList() {
		return beneficioList;
	}

	public void setBeneficioList(List<Beneficio> beneficioList) {
		this.beneficioList = beneficioList;
	}

	public List<Afastamento> getAfastamentoList() {
		return afastamentoList;
	}

	public void setAfastamentoList(List<Afastamento> afastamentoList) {
		this.afastamentoList = afastamentoList;
	}

	public List<AlteracaoSalarial> getAltSalarioList() {
		return altSalarioList;
	}

	public void setAltSalarioList(List<AlteracaoSalarial> altSalarioList) {
		this.altSalarioList = altSalarioList;
	}

	public String getSituacao() {
		return situacao;
	}

	public void setSituacao(String situacao) {
		this.situacao = situacao;
	}
}
